home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / parse / x400_val.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  3.8 KB  |  175 lines

  1. /* x400_validate.c: validate an x400 address */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/parse/RCS/x400_val.c,v 6.0 1991/12/18 20:23:41 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/parse/RCS/x400_val.c,v 6.0 1991/12/18 20:23:41 jpo Rel $
  9.  *
  10.  * $Log: x400_val.c,v $
  11.  * Revision 6.0  1991/12/18  20:23:41  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16. #include "head.h"
  17. #include "adr.h"
  18. #include "or.h"
  19.  
  20. extern char or_error[];
  21.  
  22. static int x400_val_mta(), x400_val_local();
  23.  
  24. int x400_validate(ad, rp)
  25. register ADDR    *ad;
  26. RP_Buf        *rp;
  27. {
  28.     char    tbuf[BUFSIZ], *replace;
  29.     int    type;
  30.  
  31. #ifdef    NOTNEEDED
  32.     /* should have already been done when on_or was being set up */
  33.     if (or_checktypes (ad->aparse->orname->on_or,
  34.                tmp) == NOTOK) {
  35.         PP_LOG(LLOG_EXCEPTIONS,
  36.                ("Bad OR address '%s'", tmp));
  37.         if (ad->aparse->x400_error)
  38.             free(ad->aparse->x400_error);
  39.         ad->aparse->x400_error = strdup(tmp);
  40.         return RP_BAD;
  41.     }
  42. #endif
  43.  
  44.     if (or_check (&(ad->aparse->orname->on_or),
  45.               tbuf, &type,
  46.               &(ad->aparse->local_hub_name),
  47.               &replace, 
  48.               &(ad->aparse->lastMatch)) == NOTOK) {
  49.         PP_DBG (("x400_validate OR_check failed '%s'",
  50.              or_error));
  51.         if (ad->aparse->x400_error)
  52.             free(ad->aparse->x400_error);
  53.         ad->aparse->x400_error = strdup(or_error);
  54.         return RP_BAD;
  55.     }
  56.  
  57.     PP_DBG (("x400_validate (tbuf=%s, type=%d)",
  58.          tbuf, type));
  59.  
  60.     if (replace != NULLCP) 
  61.         free(replace);
  62.  
  63.     fillin_400_str(ad);
  64.  
  65.     switch (type) {
  66.         case OR_ISLOCAL:
  67.         return x400_val_local(ad,tbuf,rp);
  68.         case OR_ISMTA:
  69.         return x400_val_mta(ad,tbuf,rp);
  70.         default:
  71.         PP_LOG (LLOG_EXCEPTIONS,
  72.             ("Illegal return from or_check '%d'", type));
  73.         return RP_MECH;
  74.     }
  75. }
  76.  
  77. /*   */
  78.  
  79. static int x400_val_mta (ad, name, rp)
  80. register ADDR    *ad;
  81. char        *name;
  82. RP_Buf        *rp;
  83. {
  84.     char    tmp[BUFSIZ];
  85.     LIST_RCHAN    *rlp;
  86.  
  87.     /* not local so remove local if there */
  88.     if (ad->aparse->x400_local) {
  89.         free(ad->aparse->x400_local);
  90.         ad->aparse->x400_local = NULLCP;
  91.     }
  92.  
  93.     /* -- look up the channel table -- */
  94.     if (ad->ad_outchan == NULLIST_RCHAN)
  95.         if (tb_getchan (name,
  96.                 &(ad->ad_outchan)) != OK) {
  97.             if (ad->aparse->x400_error)
  98.                 free(ad->aparse->x400_error);
  99.  
  100.             (void) sprintf(tmp,
  101.                        "Unknown domain '%s'",
  102.                        name);
  103.             PP_NOTICE(("No x400 channel regisitered for '%s'",
  104.                    name));
  105.             ad->aparse->x400_error = strdup(tmp);
  106.         }
  107.  
  108.     for (rlp=ad->ad_outchan;rlp;rlp=rlp->li_next)
  109.         if (rlp->li_mta == NULLCP)
  110.             rlp->li_mta = strdup(name);
  111.  
  112.     if (ad->ad_outchan == NULLIST_RCHAN) {
  113.         (void) strcpy (rp -> rp_line, ad -> aparse->x400_error);
  114.         return rp -> rp_val = RP_BAD;
  115.     }
  116.     return RP_AOK;
  117. }
  118.  
  119. /*   */
  120.  
  121. static int x400_val_local (ad, name, rp)
  122. register ADDR    *ad;
  123. char        *name;
  124. RP_Buf        *rp;
  125. {
  126.     char    tmp[BUFSIZ];
  127.     OR_ptr    local;
  128.     
  129.  
  130.     if (ad->aparse->lastMatch != NULLOR 
  131.         && (local = ad->aparse->lastMatch->or_next) != NULLOR) {
  132.         /* try first looking up with all components */
  133.         /* including DDAs */
  134.         int    retval;
  135.         char    *saveerror = ad->aparse->x400_error;
  136.         ad->aparse->x400_error = NULLCP;
  137.         local -> or_prev = NULLOR;
  138.         or_or2std(local, tmp, FALSE);
  139.         if (ad->aparse->x400_local) 
  140.             free (ad->aparse->x400_local);
  141.         ad->aparse->x400_local = strdup(tmp);
  142.         local -> or_prev = ad->aparse->lastMatch;
  143.         
  144.         if (!rp_isbad(retval = ad_local(tmp, ad, rp)))
  145.             return retval;
  146.         if (ad->aparse->x400_error)
  147.             free(ad->aparse->x400_error);
  148.         ad->aparse->x400_error = saveerror;
  149.     }
  150.  
  151.     if (ad->aparse->x400_local) 
  152.         free (ad->aparse->x400_local);
  153.     if (or_getpn(ad->aparse->orname->on_or,
  154.              tmp) == TRUE)
  155.         ad->aparse->x400_local = strdup(tmp);
  156.     else
  157.         ad->aparse->x400_local = NULLCP;
  158.  
  159.     return ad_local(name, ad, rp);
  160. }
  161.  
  162. /*   */
  163.  
  164. int fillin_400_str (ad)
  165. register ADDR    *ad;
  166. {
  167.     char    tbuf[BUFSIZ];
  168.  
  169.     if (ad->aparse->x400_str) free(ad->aparse->x400_str);
  170.     
  171.     or_or2std(ad->aparse->orname->on_or, tbuf, FALSE);
  172.     
  173.     ad->aparse->x400_str = strdup(tbuf);
  174. }
  175.